<?php
/**
 * Created by PhpStorm.
 * User: yangfan
 * Date: 2019/11/8
 * Time: 6:19 PM
 */

namespace App\BO\OrderStatus;

use App\BO\OrderStatus\Meta\UserApplyRefundInfo;
use App\BO\OrderStatus\Meta\UserCancelInfo;
use App\BO\PaymentState\Pay\PayInfo;

/**
 * 订单状态流转
 * Interface IOrderFlow
 * @package App\BO\OrderStatus
 */
interface IOrderFlow
{
    /**
     * 订单初始化操作
     * @return void
     */
    public function init();

    /**
     * 支付动作
     * @param PayInfo $payInfo
     * @return void
     */
    public function pay(PayInfo $payInfo);

    /**
     * 分配订单动作
     * @return void
     */
    public function distribute();

    /**
     * 服务动作(OA端调用)
     * @deprecated
     * @return void
     */
    public function service();

    /**
     * 服务开始
     * @return void
     */
    public function serviceStart();

    /**
     * 服务完成
     * @return void
     */
    public function serviceFinish();

    /**
     * 用户申请退款
     * @param UserApplyRefundInfo $refundInfo
     * @return void
     */
    public function applyRefund(UserApplyRefundInfo $refundInfo);

    /**
     * OA 管理员发起退款操作
     */
    public function adminApplyRefund();

    /**
     * 管理员拒绝退款
     * @return mixed
     */
    public function adminRejectRefund();

    /**
     * 用户取消了退款
     * @return mixed
     */
    public function userCancelledRefund();

    /**
     * 向第三方平台正式发起退款申请
     * @return void
     */
    public function applyThirdPartRefund();

    /**
     * 保洁员报备问题
     * @return mixed
     */
    public function report();

    /**
     * 保洁员取消报备
     * @return void
     */
    public function cleanerCancelReport();

    /**
     * 管理员同意报备
     * @return void
     */
    public function adminAgreeReport();

    /**
     * 管理员拒绝报备
     * @return void
     */
    public function adminRejectReport();

    /**
     * 退款动作
     * @return void
     */
    public function refund();

    /**
     * 评价动作
     * @return void
     */
    public function comment();

    /**
     * 订单过期
     * @return void
     */
    public function expire();

    /**
     * 订单被用户取消
     * @param UserCancelInfo $userCancelInfo
     * @return void
     */
    public function userCancel(UserCancelInfo $userCancelInfo);
}
